#region Copyright (c) 2003-2005, Luke T. Maxon



/********************************************************************************************************************

'

' Copyright (c) 2003-2005, Luke T. Maxon

' All rights reserved.

' 

' Redistribution and use in source and binary forms, with or without modification, are permitted provided

' that the following conditions are met:

' 

' * Redistributions of source code must retain the above copyright notice, this list of conditions and the

' 	following disclaimer.

' 

' * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and

' 	the following disclaimer in the documentation and/or other materials provided with the distribution.

' 

' * Neither the name of the author nor the names of its contributors may be used to endorse or 

' 	promote products derived from this software without specific prior written permission.

' 

' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED

' WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A

' PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR

' ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

' LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

' INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

' OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN

' IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

'

'*******************************************************************************************************************/



#endregion



using System;

using System.Windows.Forms;



namespace SuedeTest.Core {

   /// <summary>

   /// A ControlTester for MessageBoxes.  

   /// Allows you to handle and test MessageBoxes by pressing any of the

   /// buttons that ordinarily appear on them.

   /// </summary>

   /// <remarks>

   /// It does not extend ControlTester because MessageBoxes are not controls.</remarks>

   /// <code>

   /// public void MessageBoxHandler

   /// {

   /// 	MessageBoxTester messageBox = new MessageBoxTester( "MessageBoxName" );

   /// 	Assert.AreEqual( "MessageBoxText", messageBox.Text );

   ///   Assert.AreEqual( "MessageBoxTitle", messageBox.Title );

   /// 	messageBox.SendCommand( MessageBoxTester.Command.OK );

   /// }

   /// </code>

   public class MessageBoxTester : Tester<MessageBox> {

      public MessageBoxTester() { }

      /// <summary>

      /// Available commands you can send to the MessageBox.

      /// </summary>

      /// <remarks>

      /// There are convenience methods for OK and Cancel, so you should not need 

      /// those.

      /// </remarks>

      public enum Command : int {

         /// <summary>

         /// Represents an OK button on a <see cref="MessageBox"/>.

         /// </summary>

         OK = 1,

         /// <summary>

         /// Represents a Cancel button on a <see cref="MessageBox"/>.

         /// </summary>

         Cancel = 2,

         /// <summary>

         /// Represents an Abort button on a <see cref="MessageBox"/>.

         /// </summary>

         Abort = 3,

         /// <summary>

         /// Represents a Retry button on a <see cref="MessageBox"/>.

         /// </summary>

         Retry = 4,

         /// <summary>

         /// Represents an Ignore button on a <see cref="MessageBox"/>.

         /// </summary>

         Ignore = 5,

         /// <summary>

         /// Represents a Yes button on a <see cref="MessageBox"/>.

         /// </summary>

         Yes = 6,

         /// <summary>

         /// Represents a No button on a <see cref="MessageBox"/>.

         /// </summary>

         No = 7,

         /// <summary>

         /// Represents a Close button on a <see cref="MessageBox"/>.

         /// </summary>

         Close = 8,

         /// <summary>

         /// Represents a Close button on a <see cref="MessageBox"/>.

         /// </summary>

         Help = 9

      }



      private IntPtr handle = IntPtr.Zero;



      /// <summary>

      /// Creates a MessageBoxTester with the specified handle.  NUnitForms

      /// users probably won't use this directly.  Use the other constructor.

      /// </summary>

      /// <param name="handle">The handle of the MessageBox to test.</param>

      public MessageBoxTester(IntPtr handle)

         : base((string)null) {

         this.handle = handle;

      }



      /// <summary>

      /// Creates a MessageBoxTester that finds MessageBoxes with the

      /// specified name.

      /// </summary>

      /// <param name="name">The name of the MessageBox to test.</param>

      public MessageBoxTester(string name) : base(name) { }



      /// <summary>

      /// Returns the caption on the message box we are testing.

      /// </summary>

      public string Title {

         get { return WindowHandle.GetCaption(FindMessageBox()); }

      }



      /// <summary>

      /// Returns the text of the message box we are testing.

      /// </summary>

      public string Text {

         get { return WindowHandle.GetText(FindMessageBox()); }

      }



      /// <summary>

      /// Sends a command to the MessageBox.

      /// </summary>

      /// <param name="cmd">The <see cref="Command"/> to send to this <see cref="MessageBox"/>.</param>

      public void SendCommand(Command cmd) {

         IntPtr box = FindMessageBox();

         Win32.SendMessage(box, (int)Win32.WindowMessages.WM_COMMAND, (UIntPtr)((uint)cmd), IntPtr.Zero);

      }



      /// <summary>

      /// Clicks the Ok button of a MessageBox.

      /// </summary>

      public void ClickOk() {

         SendCommand(Command.Cancel);  //HACKHACKHACK

      }



      public void ClickYes() {

         SendCommand(Command.Yes);

      }



      /// <summary>

      /// Clicks the cancel button of a MessageBox.

      /// </summary>

      public void ClickCancel() {

         SendCommand(Command.Cancel);

      }



      private IntPtr FindMessageBox() {

         if (handle != IntPtr.Zero) {

            return handle;

         }

         handle = Win32.FindWindow(null, _name);

         if (handle == IntPtr.Zero) {
            throw new NoSuchControlException("Message box not visible");
         }

         return handle;

      }

   }

}